#ifndef CELLEDIT_H
#define CELLEDIT_H

#include <QWidget>
#include <QSpinBox>
#include <QDoubleSpinBox>
#include <QPushButton>
#include <QLabel>
#include <QMessageBox>
#include <QPalette>

#include "../../mainWindow/defines.h"

#define DEFISINTSPIN	true
#define DEFISSHOWBUT	true
#define DEFISSHOWSPIN	true

#define DEFIMIN		0
#define DEFIMAX		1
#define DEFDMIN		0.0
#define DEFDMAX		1.0

#define DEFPRECISION	3

#define DEFTEXTBUTTON	"..."

class CellEdit : public QWidget {
  Q_OBJECT
public:
  CellEdit(QWidget *parent = 0);
  CellEdit(QColor color, QWidget *parent = 0);

  //Является ли спин целочисленным
  bool isIntSpin() { return insIsIntSpin; };
  void setIsIntSpin(bool newVal);
  
  int iMax() { return intSpin->maximum(); };
  void setIMax(int newVal) { intSpin->setMaximum(newVal); };
  
  int iMin() { return intSpin->minimum(); };
  void setIMin(int newVal) { intSpin->setMinimum(newVal); };

  void setIRange(int imin, int imax) { intSpin->setRange(imin, imax); };
  
  double dMax() { return doubleSpin->maximum(); };
  void setDMax(double newVal) { doubleSpin->setMaximum(newVal); };
  
  double dMin() { return doubleSpin->minimum(); };
  void setDMin(double newVal) { doubleSpin->setMinimum(newVal); };

  void setDRange(int dmin, int dmax) { doubleSpin->setRange(dmin, dmax); };

  void setStepISpin(int newStep) { intSpin->setSingleStep(newStep); };
  void setStepDSpin(double newStep) { doubleSpin->setSingleStep(newStep); };

  bool isShowButton() { return insIsShowButton; };
  void setIsShowButton(bool newVal);

  bool isShowSpin() { return insIsShowSpin; };
  void setIsShowSpin(bool newVal);

  bool labelColorForSpin() { return insLabelColorForSpin; };
  void setLabelColorForSpin(bool newVal);

  int valueIntSpin() { return intSpin->value(); };

  double valueDoubleSpin() { return doubleSpin->value(); };

  QString textLabel() { return label->text(); };
  void setTextLabel(const QString & newStr) { label->setText(newStr); };

  QString addStr() { return insAddStr; };
  void setAddStr(const QString & newVal);

  QString buttonText() { return button->text(); };
  void setButtonText(const QString & newVal) { button->setText(newVal); };

  void setColor(const QColor & newColor);

  void setAutoFillBackground(bool val) { label->setAutoFillBackground(val); };

  void isIndent(bool val);

  bool isNull();

protected:
  QSpinBox * intSpin;
  QDoubleSpinBox * doubleSpin;
  QPushButton * button;
  QLabel * label;
  QPalette palette;
  int indent;
  /* void mousePressEvent(QMouseEvent *event); */
  /* void keyPressEvent(QKeyEvent * event); */

  //Убирает незначащие цифры после запятой
  double toPrec(double num) { double d = fmod(num, 0.01); return  num - d + double(rint(d * 1000))/1000; };

private:
  //Отображение спина
  bool insIsShowSpin;
  //Является ли спин целочисленным
  bool insIsIntSpin;
  //Отображение кнопки
  bool insIsShowButton;
  //Цвет спина
  bool insLabelColorForSpin;
  //Дополнение к строке
  QString insAddStr;

  void init();

signals:
  void clickButton();
  void changeValueISpin(int chVal);
  void changeValueDSpin(double chVal);

public slots:
  void setEditView();
  void setLabelView();
  void emChangeValueISpin(int val) { emit changeValueISpin(val); };
  void emChangeValueDSpin(double val) { emit changeValueDSpin(val); };
  void emClickButton() { emit clickButton(); };
  void setValueIntSpin(int newVal) { intSpin->setValue(newVal); setLabelI(); };
  void setValueDoubleSpin(double newVal) { doubleSpin->setValue(newVal); setLabelD(); };
  void setLabelI();
  void setLabelD();

}; //class CellEdit : public QGraphicsView

#endif
